Skip to content

[pull] main from expo:main#596

Merged
pull[bot] merged 16 commits intocode:mainfrom
expo:main
Feb 16, 2026
Merged

[pull] main from expo:main#596
pull[bot] merged 16 commits intocode:mainfrom
expo:main

Conversation

@pull
Copy link

@pull pull bot commented Feb 16, 2026

See Commits and Changes for more details.


Created by pull[bot] (v2.0.0-alpha.4)

Can you help keep this open source service alive? 💖 Please sponsor : )

amandeepmittal and others added 16 commits February 16, 2026 15:34
…iles (#43161)

# Why

<!--
Please describe the motivation for this PR, and link to relevant GitHub
issues, forums posts, or feature requests.
-->

Follow-up #43044

## How

- Reverted `extractFrontmatter()` in
`scripts/generate-markdown-pages-utils.ts` to keep all frontmatter
fields, only stripping lines with empty values (e.g. `modificationDate:`
with no value from shallow CI clones).
- Restored the original filter regex from `/^modificationDate:\s+\S/`
(keep only modificationDate) back to `/^\w+:\s*$/` (strip empty-value
lines).
- Fixed the return delimiter format from `'---\n' + filtered +
'\n---\n'` back to `'---\n' + filtered + '---\n'`.
- Reverted the corresponding tests in
`scripts/generate-markdown-pages-utils.test.ts` to match the pre-#43044
behavior.

# Test Plan

<!--
Please describe how you tested this change and how a reviewer could
reproduce your test, especially if this PR does not include automated
tests! If possible, please also provide terminal output and/or
screenshots demonstrating your test/reproduction.
-->

Run `yarn run export-preview` and then serve the `out` directory using
`npx serve out`. Then, open a page in docs and click View Markdown:

<img width="1922" height="464" alt="CleanShot 2026-02-16 at 12 42 31@2x"
src="https://github.com/user-attachments/assets/b6724c72-27f4-4788-b519-c7af981f1925"
/>

Run `yarn test` and confirm the `extractFrontmatter` tests pass.

# Checklist

<!--
Please check the appropriate items below if they apply to your diff.
-->

- [ ] I added a `changelog.md` entry and rebuilt the package sources
according to [this short
guide](https://github.com/expo/expo/blob/main/CONTRIBUTING.md#-before-submitting)
- [ ] This diff will work correctly for `npx expo prebuild` & EAS Build
(eg: updated a module plugin).
- [ ] Conforms with the [Documentation Writing Style
Guide](https://github.com/expo/expo/blob/main/guides/Expo%20Documentation%20Writing%20Style%20Guide.md)
# Why

This PR updates the labels in the developer menu for better consistency
across platforms. It renames "JS debugger" to "DevTools" and makes other
label adjustments to provide a more unified experience.

# How

- Changed a couple of labels
- updated dev tools icon
- Updated documentation to reflect these label changes
- Removed unused string resources from Android strings.xml

# Test Plan

- tested locally, green CI

# Checklist

- [x] I added a `changelog.md` entry and rebuilt the package sources
according to [this short
guide](https://github.com/expo/expo/blob/main/CONTRIBUTING.md#-before-submitting)
…and properly default to `null` (#43143)

# Why

We accidentally had the `|| null` fallback for `origin` in the
environment values, rather than only in the last `origin()` call. This
matched `globalThis.origin` (which also has this default) but not the
`origin()` API convention.

We also used the `Origin` header in development environments, which
isn't guaranteed to be present. We assume development has no request
forwarding that's relevant to us, so we can always use `request.url`
instead.

**This shouldn't be backported to SDK 54 as it's technically a breaking
change.**

# How

- Switch to `request.url` for deriving `origin` in development (node and
workerd adapters)
- Fix `origin` type in `RequestAPI` to allow `null`
- Remove `|| 'null'` for `|| null` defaults in adapters

# Test Plan

- n/a

# Checklist

<!--
Please check the appropriate items below if they apply to your diff.
-->

- [x] I added a `changelog.md` entry and rebuilt the package sources
according to [this short
guide](https://github.com/expo/expo/blob/main/CONTRIBUTING.md#-before-submitting)
- [ ] This diff will work correctly for `npx expo prebuild` & EAS Build
(eg: updated a module plugin).
- [ ] Conforms with the [Documentation Writing Style
Guide](https://github.com/expo/expo/blob/main/guides/Expo%20Documentation%20Writing%20Style%20Guide.md)
# Why
Changes to `*.web.*` files do not affect Android and iOS builds, so they
shouldn't trigger the test suite E2E.
This is the case here: #43153

# How
Add `**/*.web.*` to `shared-ignores`.
List of affected files:
[web.txt](https://github.com/user-attachments/files/25339421/web.txt)

# Test Plan
Tested on a stacked PR.
# Why
Part of a PR stack the brings more feature parity between web and native
Adds audio sampling on web

# How
Web has good support for this using `AnalyserNode`

# Test Plan
Bare expo
…anges (#43015)

# Why

I wanted to add clear errors if the plugin is misconfigured due to
changes introduced in :#43014 , but
I've found it impossible to actually detect if the service has
successfully started with the current singleton-based implementation for
some reason.

# How

- Migrate to having a separate Recodring and playback services
- Use the pattern of having a single service and multiple service
connections and bindings
- Add errors if the plugin is misconfigured
- Try connecting to the service in the recording preparation, if
connection fails throw an error
- For the controls service, we don't have the luxury of having an async
function to wait to connect to the service, so we start the playback and
update the service once it connects. If it fails we use the jsLogger to
send a visible non-fatal error to developers

# Test Plan

Tested in prebuilt NCL on Android
# Why
Part of a PR stack the brings more feature parity between web and native
Adds media controls on web

# How
<img width="317" height="515" alt="Screenshot 2026-02-14 at 10 52 44" src="https://github.com/user-attachments/assets/85cf2e9c-df51-4b18-9fd5-3707bf8a3846" />
<img width="360" height="208" alt="Screenshot 2026-02-14 at 10 38 33" src="https://github.com/user-attachments/assets/48b34d93-2fa8-485c-80d0-45fe0ee788b3" />


# Test Plan
Bare expo
# Why
Part of a PR stack the brings more feature parity between web and native
Adds selecting the recording input on web

# How
Access `navigator.mediaDevices` to get the list of available devices

# Test Plan
Bare expo
# Why
Part of a PR stack the brings more feature parity between web and native
Adds metering support for recordings on web

# How
Similar to sampling, we can do this with an `AnalyserNode`. We use the same algorithm we do on native in `getMeteringLevel()`

# Test Plan
Bare expo
# Why
`AudioPlayer.web` has gotten huge.

# How
Refactor player, recorder and utils into separate files.

# Test Plan
Bare expo
…rs (#43171)

# Why

This allows us to preload all server modules in one method. This is
useful to hoist loading of any split modules to an ahead of time point
(e.g. top-level await)

# How

- Add `preload` common environment method
- Expose `preload` method on EAS and workerd request handler

# Test Plan

- Ran through a manual deployment flow, works as expected

# Checklist

<!--
Please check the appropriate items below if they apply to your diff.
-->

- [x] I added a `changelog.md` entry and rebuilt the package sources
according to [this short
guide](https://github.com/expo/expo/blob/main/CONTRIBUTING.md#-before-submitting)
- [ ] This diff will work correctly for `npx expo prebuild` & EAS Build
(eg: updated a module plugin).
- [ ] Conforms with the [Documentation Writing Style
Guide](https://github.com/expo/expo/blob/main/guides/Expo%20Documentation%20Writing%20Style%20Guide.md)
# Why

The tests in the previous setup:

- Brownfield artifacts publishing
- Test app build
- Maestro execution on emulator

All executed in a single job were unstable, ending in:

```sh
FATAL        | Not enough space to create userdata partition. Available: 4031.36 MB \
     at /home/runner/.android/avd/avd-36.avd, need 7372.80 MB.
```

# How

Split the publishing & building app and test execution into two jobs,
similar to other E2E workflows

# Test Plan

Ensured the updated setup works on CI

# Checklist

N / A
# Why

* Maintaining `expo-ui.bundle.swift` is almost impossible to be
up-to-date
* User can have different expo-ui version

# How

Use scripts similar to `@expo/log-box` to add a build step that prepares
the bundle.

# Test Plan

Run widgets-tester. Everything should still work without any changes.
…se shapes (#43158)

## Problem

`ClipShapeModifier` and `MaskModifier` use a raw `String` for the shape
field instead of the `ShapeType` enum. Only `"circle"` and
`"roundedRectangle"` are handled -- everything else falls through to
`Rectangle()` silently.

So `clipShape("capsule")` renders a rectangle. No error, no warning.

Every other shape modifier (`BackgroundModifier`,
`ContainerShapeModifier`, `ContentShapeModifier`, `GlassEffectModifier`)
uses `ShapeType` with exhaustive switching. These two just got missed
when `ShapeType` was introduced in #40748.

## Fix

- `ClipShapeModifier`: `@Field var shape: String` → `@Field var shape:
ShapeType`
- `MaskModifier`: `@Field var shape: String` → `@Field var shape:
ShapeType`
- Exhaustive switch on all 5 `ShapeType` cases, no `default` fallthrough
- Added `roundedCornerStyle` and `cornerSize` fields, switched to
`makeCapsule(style:)` and
`makeRoundedRectangle(cornerRadius:cornerSize:style:)` helpers to match
`ContentShapeModifier`/`BackgroundModifier`/`ContainerShapeModifier`
- TypeScript types for `clipShape()` and `mask()` updated to include
`'capsule' | 'ellipse'`

## Test plan

- `clipShape("capsule")` → capsule clipping (not rectangle)
- `clipShape("ellipse")` → ellipse clipping (not rectangle)
- `mask("capsule")` / `mask("ellipse")` → same
- Existing shapes (`rectangle`, `circle`, `roundedRectangle`) unchanged
…43169)

# Why

There were some insights from the team, that compilation test for iOS is
clogging the CI, as it occupies two runners for around an hour

# How

iOS compilation test now runs as a single job, thus occupying only one
runner for roughly two hours

# Test Plan

Ensured that the updated workflow passes on the CI

# Checklist

N / A
@pull pull bot locked and limited conversation to collaborators Feb 16, 2026
@pull pull bot added the ⤵️ pull label Feb 16, 2026
@pull pull bot merged commit 6058986 into code:main Feb 16, 2026
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

10 participants

Comments